被Symbolic link和mv吓了一跳

July 20, 2013

今天在改一个Wordpress主题,路径是相当遥远:

~/oldu/projects/3d-printing/3d-theme/

为了方便测试,我在Wordpress的themes目录见了个符号连接到上面的路径。

$ ln -s ~/oldu/projects/3d-printing/3d-theme/ /path/to/wordpress/wp-content/themes/

一切都很好,然后我就直接在themes目录下的3d-theme工作了。我改啊改改啊改,然后我想临时移开一个文件,就移到..吧:

$ mv content-excerpt.php ..

我再改啊改,然后发现themes目录下没有content-excerpt.php,我大吃一惊,那个文件改了还没提交呢,就这样没了?

折腾一翻(TestDisk什么的~. ~),我才发现那个文件原来是被移到了~/oldu/projects/3d-printing/,而不是我以为的/path/to/wordpress/wp-content/themes/

我觉得这有点怪,例如我现在有这样的目录结构

outer/
├── dir1
└── dir2
    └── dir3 -> /tmp/workspace/outer/dir1/

dir2里的dir3就是到dir1的符号链接,当前目录是dir3时,..会指向那里?

简单方法是ls看看文件就知道了:

$ ls ..
dir1  dir2

也就是所..实际上应该是outer。

对比一下inode发现的确是这样的:

$ stat /tmp/workspace/outer/ | grep Inode
Device: 1eh/30d	Inode: 67074       Links: 4

$ stat .. | grep Inode
Device: 1eh/30d	Inode: 67074       Links: 4

但是cd ..的时候,你会传送到dir2而不是outer,说明..作为cd参数时,不是作为一个目录,而是被特殊处理的。要跳到outer,加-P选项,但是bash里一直不行,ash倒是可以:

$ pwd
/tmp/workspace/outer/dir2/dir3
$ cd -P ..
$ pwd
/tmp/workspace/outer

bash里出错:

$ cd -P ..
bash: cd: - : invalid option
cd: usage: cd [-L|[-P [-e]]] [dir]

这是bug?

Edit 2013-09-23: 出错是因为我的cd是一个函数的别名,在那个函数里没处理好参数。